/**
 *
 * 同步：
 *
 * 异步：
 *
 * Event Loop事件循环
 *
 * settimeout -> 宏任务
 *
 * new promise 部分 =>  同步
 * .then(res) 部分 =>   异步（微任务）
 *
 * 在代码中，微任务先走
 */

// console.log(1)

// new Promise((resolve, reject) => {
// 	console.log(6)
// 	resolve()
// }).then((res) => {
// 	console.log(7)
// })

// setTimeout(() => {
// 	console.log(2) //
// }, 0)

// setTimeout(() => {
// 	console.log(3) //
// }, 100)

// console.log(4)

// 1 4 2 3

/**
 *
 * @returns 案例
 * 1. 红绿灯  三个定时器
 *
 *
 */

// setTimeout(() => {
// 	console.log('红灯')
// }, 2000)

// setTimeout(() => {
// 	console.log('绿灯')
// }, 3000)

// setTimeout(() => {
// 	console.log('黄灯')
// }, 1000)

// 案例：

// function traficLight() {
// 	setTimeout(() => {
// 		console.log('红灯')
// 		setTimeout(() => {
// 			console.log('绿灯')
// 			setTimeout(() => {
// 				console.log('黄灯')
// 				traficLight()
// 			}, 1000)
// 		}, 3000)
// 	}, 2000)
// }
// traficLight()

// function traficLight(fn, content, time) {
// 	setTimeout(() => {
// 		fn(content)
// 	}, time)
// }
// 回调地狱 callback hell
// traficLight(
// 	(res) => {
// 		console.log(res)
// 		traficLight(
// 			(res) => {
// 				console.log(res)
// 				traficLight(
// 					(res) => {
// 						console.log(res)
// 					},
// 					'黄灯',
// 					1000
// 				)
// 			},
// 			'绿灯',
// 			3000
// 		)
// 	},
// 	'红灯',
// 	2000
// )

function promiseTraficLight(content, time) {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve(content)
		}, time)
	})
}

function traffic() {
	promiseTraficLight('红灯', 2000)
		.then((res) => {
			console.log(res)
			return promiseTraficLight('绿灯', 3000)
		})
		.then((res) => {
			console.log(res)
			return promiseTraficLight('黄灯', 1000)
		})
		.then((res) => {
			console.log(res) // 黄灯
		})
		.then((res) => {
			traffic()
		})
}

// traffic()
/**
 * 1. 回调函数 :（一个函数，作为参数）
 *
 */
// return 同步输出
// function auto(fn) {
// 	setTimeout(() => {
// 		fn('hello world')
// 	}, 0)
// }
// // 函数执行的时候，会把实参 传递给 形参
// auto((res) => {
// 	console.log('res:', res)
// })

// 2. promise
// function auto() {
// 	return new Promise((resolve, reject) => {
// 		setTimeout(() => {
// 			resolve('hello world')
// 		}, 0)
// 	})
// }

// auto().then((res) => {
// 	console.log('res:', res)
// })

// 3. async
function auto() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			resolve('hello world')
		}, 0)
	})
}
// async 将异步代码变为了同步输出
// 1. async会返回一个promise
// 2. await 后面会跟promise
const asyncFn = async () => {
	const data = await auto()
	// console.log('data:', data)
	return data
}

// asyncFn().then((res) => {
// 	console.log(res)
// })

// 使用三种解决方案，在函数外部拿到 hello world这个返回结果

// 1. 回调
// 2. promise
// 3. async
